package com.dc.designPattern._4_builder.extend.improve;

import cn.hutool.core.util.StrUtil;
import com.google.common.collect.Lists;

import java.util.List;

/**
 * Description: 抽象产品_车
 * @author: gdc
 * @date: 2021/6/21
 * @version 1.0
 */
public abstract class CarModel {

    /**
     * 执行顺序列表
     */
    private List<String> sequence = Lists.newArrayList();


    /**
     * 启动方法
     */
    protected abstract void start();

    /**
     * 关闭方法
     */
    protected abstract void stop();

    /**
     * 喇叭方法
     */
    protected abstract void alarm();

    /**
     * 引擎方法
     */
    protected abstract void engineBoom();

    /**
     *  运行方法，本质为模版方法模式
     *
     *  新的需求，需要从外部动态的修改方法的执行顺序，故，此方法不能满足当前需求
     */
    /*public final void run() {
        this.start();
        this.engineBoom();
        this.alarm();
        this.stop();
    }*/

    /**
     * 运行方法, 通过传入参数，来指定运行的顺序
     */
    public final void run() {
        for (String action : sequence) {
            if (StrUtil.equalsIgnoreCase(action, "start")) {
                this.start();
            } else if (StrUtil.equalsIgnoreCase(action, "stop")) {
                this.stop();
            } else if (StrUtil.equalsIgnoreCase(action, "alarm")) {
                this.alarm();
            } else if (StrUtil.equalsIgnoreCase(action, "engineBoom")) {
                this.engineBoom();
            } else {
                throw new IllegalArgumentException("传入的参数有误");
            }
        }
    }

    /**
     * 设置执行殊勋
     */
    protected void setSequence(List<String> sequence) {
        this.sequence = sequence;
    }
}
